from QQLoginTool.QQtool import OAuthQQ
from django.shortcuts import render

# Create your views here.
from django.views import View
"""
步骤
QQ互联开发者申请步骤（可以不用做）
QQ互联应用申请步骤（可以不用做）
按照文档开发

1准备工作：-------准备好了
# QQ登录参数
# 我们申请的 客户端id
QQ_CLIENT_ID = '101474184'-----》这个就是appid
# 我们申请的 客户端秘钥
QQ_CLIENT_SECRET = 'c6ce949e04e12ecc909ae6a8b09b637c'-----》这个就是appkey
# 我们申请时添加的: 登录成功后回调的路径
QQ_REDIRECT_URI = 'http://www.meiduo.site:8080/oauth_callback.html'


2放置qq登录的图标，点击qq图标实现qq登录---------前端已经实现了


OAuth2.0认证介绍（解决第三方登录时用户名和密码不泄露的问题）：
1用户访问网站进行qq登录
2网站将qq登录的请求发送给腾讯
3用户将qq账号与密码输入腾讯，腾讯进行校验
4腾讯校验成功后返回给网站
5网站返回页面给用户

3根据OAuth2.0来获取code和token
	对于应用而言，需两步
	1获取Authorization Code----->表面是一个链接，实质是需要用户同意，然后获取code
	2通过Authorization Code获取Access Token

4通过token换取openid
openid是此网站上唯一对应用户身份的标识，
网站可将此ID进行存储便于用户下次登录时辨识其身份，或将其与用户在网站上的原有账号进行绑定。

把openid和用户信息进行一一绑定

生成用户绑定链接---获取code---获取token---获取openid---保存openid
"""
from django.http import JsonResponse
from meiduo_mall import settings
#1生成QQLoginTool实例
class QQLoginURLView(View):
    def get(self,request):
        #client_id=None, -----》就是appid
        #client_secret=None,---->就是appsecret
        #redirect_uri=None--->要跳转的页面
        #state=None-->暂时不清楚含义
        qq=OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                   client_secret=settings.QQ_CLIENT_SECRET,
                   redirect_uri=settings.QQ_REDIRECT_URI,
                   state='xxxxxx')

        #2调用对象的方法生成跳转链接
        qq_login_url=qq.get_qq_url()

        # 3返回响应
        return JsonResponse({'code':0,'errmsg':'ok','login_url':qq_login_url})


from apps.oauth.models import OAuthQQUser
from django.contrib.auth import login
import json
from apps.users.models import User
from apps.oauth.utils import generic_openid,check_access_token
class OauthQQView(View):
    def get(self,request):
        code=request.GET.get('code')
        if code is None:
            return JsonResponse({'code':'400','errmsg':'参数有错误'})
        qq=OAuthQQ(client_id=settings.QQ_CLIENT_ID,
                   client_secret=settings.QQ_CLIENT_SECRET,
                   redirect_uri=settings.QQ_REDIRECT_URI,
                   state='xxxxxx')
        token=qq.get_access_token(code)
        openid=qq.get_open_id(token)
        #拿到openid与数据库里openid进行判断，如果有匹配则直接跳转首页，如果不匹配则qq与账号进行绑定
        try:
            qquse=OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            #用 itsdangerous的类来加密



            #存在异常,需要绑定账户信息
            response = JsonResponse({'code': '400','access_token':openid})
            return response

        else:
            #不存在异常
            login(request, qquse.user)
            response=JsonResponse({'code':'0','errmsg':'ok'})
            response.set_cookie('username',qquse.user.username)
            return response


    def post(self,request):
        data=json.loads(request.body.decode())
        mobile=data.get('mobile')
        password = data.get('password')
        sms_code = data.get('sms_code')
        openid = data.get('access_token')
#对数据进行验证（省略）,在文档中可以找到


        if openid is None:
            return JsonResponse({'code':'400','errmsg':'参数有误'})
        try:
            user=User.objects.get(mobile=mobile)
        except User.DoesNotExist:
            user=User.objects.create_user(username=mobile,mobile=mobile,password=password)
        else:
            if not user.check_password(password):
                return JsonResponse({'code':'400','errmsg':'账号或者密码不正确'})

        OAuthQQUser.objects.create(user=user,openid=openid)

        login(request,user)

        response=JsonResponse({'code':0,'errmsg':'ok'})
        response.set_cookie('username',user.username)
        return response
